#include <stdio.h>

#include "hscope.h"

int main() {
    // 同golang的defer相同的用法,超出作用阈时执行，
    // 因为是析构函数里面执行，所以类似栈，先进后出
    defer (
        printf("1\n");
        printf("2\n");
    )

    defer (
        printf("3\n");
        printf("4\n");
    )

    defer(printf("hello\n");)

    // ScopeCleanup
    int a = 1;
    ScopeCleanup scu([](int a){printf("hello:%d\n", a);}, a);
    a=2;
    ScopeCleanup scu2([](int a){printf("hello:%d\n", a);}, a);

    int *i_a = new int(5);
    ScopeFree<int> sf(i_a);

    int *i_b = new int(6);
    ScopeDelete<int> sd(i_b);

    printf("this is main\n");
    return 0;
}

// 使用场景
#define MAX_LINE_LENGTH 1000

// 模拟可能失败的处理函数
int process_line(const char* input, char* output) {
    if (strlen(input) > 50) {
        return -1; // 模拟处理失败
    }
    strcpy(output, "Processed: ");
    strcat(output, input);
    return 0;
}

int main01() {
    FILE* input_file = NULL;
    FILE* output_file = NULL;
    char line[MAX_LINE_LENGTH];
    char processed_line[MAX_LINE_LENGTH + 20];
    int result = 0;

    // 打开输入文件
    input_file = fopen("input.txt", "r");
    if (!input_file) {
        perror("无法打开输入文件");
        return 1;
    }

    // 使用 defer 确保输入文件会被关闭
    defer(
        printf("关闭输入文件\n");
        fclose(input_file);
    )

    // 打开输出文件
    output_file = fopen("output.txt", "w");
    if (!output_file) {
        perror("无法打开输出文件");
        return 1;
    }

    // 使用 defer 确保输出文件会被关闭
    defer(
        printf("关闭输出文件\n");
        fclose(output_file);
    )

    // 读取、处理和写入数据
    while (fgets(line, sizeof(line), input_file)) {
        result = process_line(line, processed_line);
        if (result != 0) {
            printf("处理行时发生错误\n");
            return 1;
        }
        fputs(processed_line, output_file);
    }

    printf("文件处理完成\n");
    return 0;
}